今天會介紹一些 flask 的基本函式,所以我們還沒有正式開始寫專案。這些基本的函式十分常用,甚至有些會在幾乎每個有關 flask 的檔案中反覆出現,所以我選擇放在最前面介紹,未來如果有忘記的可以回來看一下。
我們先從一個簡單的範例來看起。請注意如果要實作的話檔名務必使用 app.py,後面會解釋。
from flask import Flask
app = Flask(__name__)
@app.route("/", methods=["GET", "POST"])
def index():
return "Index Page"
app.run(host="127.0.0.1", port=8080, debug=True)
接著只要在 command line 下指令:python app.py
,flask 就會把這個網站建立起來,可以打開瀏覽器輸入 127.0.0.1:8080
,沒有意外的話可以看到有一行 Index Page
寫在上面。
接下來我會逐行解釋這個簡單的網站:
app
作為這個 flask application 的實體。/
,這邊要注意的是 flask 要求每個路徑都要用 /
開頭,如 /meow
、/user
等等,meow
是不被允許的,會跳出 ValueError: urls must start with a leading slash
。methods
是一個 list,裡面是這個路徑所允許的 HTTP method,這邊我用 GET 和 POST 為例。如果對裝飾器不熟悉可以閱讀此篇,在此處我不多加解釋其功用。/
的 request,這個函式名稱隨意,但未來會用到。Index Page
,也就是剛剛在瀏覽器看到的東西。它的目的就是回傳 HTML 或是 response (後面會提到),未來還會加入更多複雜的方式來 render 網頁。app.run()
讓他跑,並用 host
、port
來指定要跑在哪裡,如果是在有公開 IP 的伺服器上可以直接把 host
設為該 IP,最後的 debug=True
表示現在是開發模式,flask 會打開一些 debug 的工具,等等會解釋。但未來基本上不會使用此方法,所以不會介紹太多。要把這個網站跑起來還有第二個方法,可以在命令列輸入 flask run
,這個指令是跟著 pip install flask
一起安裝的。
但要注意的是,使用這個指令會自動把程式碼裡面的 app.run()
忽略,也就是說,他會自動忽略上面的 host
和 port
,在未指定的情況下,預設 host=127.0.0.1
、port=5000
。如果要指定的話,需要傳入參數,如 flask run --host 127.0.0.1 --port 8080
,這樣會達到和上面相同的效果。
此外,理論上我們需要設定 FLASK_APP
這個環境變數,它的作用是告訴 flask 你的 flask application 在哪裡。當沒有設定的時候,他會自動去尋找 app.py
、wsgi.py
或是裡面有 create_app
、make_app
函式的模組 (後面會提到)。也就是說,如果這時候檔名不是 app.py
,他剛剛就不會順利執行了。
最後還有一個要注意的點,在執行的時候 (兩種方法都是) 畫面應該會跑出一行紅字:WARNING: This is a development server. Do not use it in a production deployment.
,這表示這個執行方法並不適合用於 production。但我們現在只是用於開發,所以可以設定 FLASK_ENV=DEVELOPMENT
這個環境變數,來告訴 flask 現在使用的環境為開發環境。在更改為開發環境的同時,flask 會打開一些 debug 相關的功能:
500 Internal Server Error
。127.0.0.1:8080/console
,flask 有一個內建的 interactive debugger 可以讓你跟系統互動。稍微修改一下剛剛的程式碼,加入一些新東西。
from flask import Flask
app = Flask(__name__)
@app.route("/", methods=["GET", "POST"])
def index():
return "Index Page"
@app.route("/dynamic/<int:id>", methods=["GET"])
def dynamic_url_page(id):
return str(id)
app.run(host="127.0.0.1", port=8080, debug=True)
在這個範例裡,我們新增了第二個路徑 /dynamic/<int:id>
,前面的 /dynamic
跟上面的 /
是接近的,新的東西在後面的 /<int:id>
。
他是 flask 提供的「動態路徑」功能,冒號前面的 int
表示他的型別,後面的 id
則是變數名稱,而這個變數需要在下方處理 request 的函式中作為一個參數。這時候存取 /dynamic/1
,flask 就會傳回 1
,但如果存取 /dynamic/meow
,那就會傳回 404 Not Found
,因為 meow
並非一個整數,並沒有符合這條路徑規則。
我們也可以把規則寫成 /dynamic/@<int:id>
,這樣一來,存取 /dynamic/@1
就會傳回 1。
值得一提的是,如果在回傳的時候沒有先把 id
轉型成 str
,那 flask 會有錯誤:TypeError: The view function did not return a valid response. The return type must be a string, dict, tuple, Response instance, or WSGI callable, but it was a int.
,這表示你回傳的不是正確的型別,合法的型別只有 str
、Response
(未來會提到) 等等,其餘可以參考附錄一。
今天看了兩個簡單的 flask 範例,基本上這樣就足以建出一個簡單的小網站,但未來我們還會繼續探討其他函式。
Flask: return value of view function
Command Line Interface